
import '../dao/ImUserDao.dart';
import '../pojo/ImPojo.dart';
import '../socket/dto/business/PullData.dart';
import 'BaseService.dart';

class ImUserService extends BaseService {

  Future<void> saveOrUpdates(List<UserInfoItem>? userInfoItemList) async {
    if (userInfoItemList == null || userInfoItemList.isEmpty) return;

    var userDao = ImUserDao();

    List<ImUser> imUsers = userInfoItemList.map((userInfoItem)=> _toImUser(userInfoItem)).toList();

    List<String> codeList = userInfoItemList.map((e) => e.userId).toList();
    var dbUsers = await userDao.getUsersByUserIds(codeList);
    Map<String, ImUser> dbUserMap  = Map<String, ImUser>.fromIterable(dbUsers,
        key: (user)=>user.userId, value: (user)=>user);

    List<ImUser> insertUsers = [];
    List<ImUser> updateUsers = [];
    for (var user in imUsers) {
      if (dbUserMap.containsKey(user.userId)) {
        user.id = dbUserMap[user.userId]?.id;
        updateUsers.add(user);
      } else {
        insertUsers.add(user);
      }
    }

    await userDao.batchInserts(insertUsers);
    await userDao.batchUpdates(updateUsers);
  }

  ImUser _toImUser(UserInfoItem userInfoItem) {
    var imUser = ImUser(userInfoItem.userId);
    imUser.userName = userInfoItem.userName;
    imUser.departmentCode = userInfoItem.departmentCode;
    imUser.mobile = userInfoItem.mobile;
    imUser.status = ImUserStatus.ofValue(userInfoItem.status?.value);
    imUser.sex = SexEnum.ofValue(userInfoItem.sex.value);
    imUser.otherDepartmentCodes = userInfoItem.otherDepartmentCodeList?.join(",");
    imUser.headImg = userInfoItem.headImg;
    imUser.motto = userInfoItem.motto;
    if (userInfoItem.firstLetter != null) {
      imUser.firstLetter = userInfoItem.firstLetter;
    }
    return imUser;
  }
}